home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / etc / hotplug / pci.agent < prev    next >
Text File  |  2006-05-01  |  4KB  |  156 lines

  1. #!/bin/sh
  2. #
  3. # PCI-specific hotplug policy agent.
  4. #
  5. # This should handle 2.4.* PCI (including Cardbus)  hotplugging,
  6. # with a consistent framework for adding device and driver specific
  7. # treatments.
  8. #
  9. # Kernel Cardbus/PCI params are:
  10. #    
  11. #    ACTION=%s [add or remove]
  12. #    PCI_CLASS=%06X
  13. #    PCI_ID=%04X:%04X
  14. #    PCI_SLOT_NAME=%s
  15. #    PCI_SUBSYS_ID=%04X:%04X
  16. #
  17. # If /proc is mounted, /proc/bus/pci/$PCI_SLOT_NAME is almost the name
  18. # of the binary device descriptor file ... just change ':' to '/'.
  19. #
  20. # On systems using Linux 2.4.* kernels, be sure to use the right
  21. # modutils (2.4.1+).
  22. #
  23. #
  24. # HISTORY:
  25. #
  26. # 26-Feb-2001    Cleanup, support comments (Gioele Barabucci)
  27. # 13-Jan-2001    Initial version of "new" hotplug agent; needs
  28. #        retesting.
  29. # 17-Jan-2001    Update to latest kernel syntax (Dan Zink)
  30. # 15-Feb-2001    Remove use of "<<" (Adam Richter)
  31. #
  32. # $Id: pci.agent,v 1.16 2004/09/20 21:43:37 kroah Exp $
  33. #
  34.  
  35. cd /etc/hotplug
  36. . ./hotplug.functions
  37.  
  38. # generated by modutils, for current 2.4.x kernels
  39. MAP_CURRENT=$MODULE_DIR/modules.pcimap
  40.  
  41. # accumulates list of modules we may care about
  42. DRIVERS=
  43.  
  44. if [ "$PCI_CLASS" = "" ] || [ "$PCI_CLASS" = "" ]; then
  45.     mesg Bad PCI agent invocation
  46.     exit 1
  47. fi
  48.  
  49. #
  50. # Each modules.usbmap format line corresponds to one entry in a
  51. # MODULE_DEVICE_TABLE(pci,...) declaration in a kernel file.
  52. #
  53. # Think of it as a database column with up to three "match specs"
  54. # to associate kernel modules with particular devices or classes
  55. # of device.  The match specs provide a reasonably good filtering
  56. # mechanism, but some driver probe() routines need to provide
  57. # extra filtering.
  58. #
  59.  
  60. pci_convert_vars ()
  61. {
  62.     pci_class=$((0x$PCI_CLASS))
  63.  
  64.     set $(echo $PCI_ID | sed -e 's/\([^:]*\):\(.*\)/\1 \2/')
  65.     pci_id_vendor=$((0x$1))
  66.     pci_id_device=$((0x$2))
  67.  
  68.     set $(echo $PCI_SUBSYS_ID | sed -e 's/\([^:]*\):\(.*\)/\1 \2/')
  69.     pci_subid_vendor=$((0x$1))
  70.     pci_subid_device=$((0x$2))
  71. }
  72.  
  73. PCI_ANY=$((0xffffffff))
  74.  
  75.  
  76. #
  77. # stdin is "modules.pcimap" syntax
  78. # on return, ONE matching module was added to $DRIVERS
  79. #
  80. pci_map_modules ()
  81. {
  82.     # comment line lists (current) pci_device_id field names
  83.     read ignored
  84.  
  85.     # look at each pci_device_id entry
  86.     # collect one match in $DRIVERS
  87.     while read module vendor device subvendor subdevice class class_mask ignored
  88.     do
  89.     # comments are lines that start with "#" ...
  90.     # be careful, they still get parsed by bash!
  91.     case "$module" in
  92.     \#*) continue ;;
  93.     esac
  94.  
  95.     # convert the fields from hex to dec
  96.     vendor=$(($vendor)); device=$(($device))
  97.     subvendor=$(($subvendor)); subdevice=$(($subdevice))
  98.     class=$(($class)); class_mask=$(($class_mask))
  99.  
  100.     : checkmatch $module
  101.  
  102.     : vendor $vendor $pci_id_vendor
  103.     if [ $vendor -ne $PCI_ANY ] && [ $vendor -ne $pci_id_vendor ]; then
  104.         continue
  105.     fi
  106.     : device $device $pci_id_device
  107.     if [ $device -ne $PCI_ANY ] && [ $device -ne $pci_id_device ]; then
  108.         continue
  109.     fi
  110.     : sub-vendor $subvendor $pci_subid_vendor
  111.     if [ $subvendor -ne $PCI_ANY ] && [ $subvendor -ne $pci_subid_vendor ]; then
  112.         continue
  113.     fi
  114.     : sub-device $subdevice $pci_subid_device
  115.     if [ $subdevice -ne $PCI_ANY ] && [ $subdevice -ne $pci_subid_device ]; then
  116.         continue
  117.     fi
  118.  
  119.     class_temp=$(($pci_class & $class_mask))
  120.     if [ $class_temp -eq $class ]; then
  121.         DRIVERS="$module $DRIVERS"
  122.         : drivers $DRIVERS
  123.         break
  124.     fi
  125.     done
  126. }
  127.  
  128.  
  129. #
  130. # What to do with this PCI hotplug event?
  131. #
  132. case $ACTION in
  133.  
  134. add)
  135.     pci_convert_vars
  136.  
  137.     LABEL="PCI slot $PCI_SLOT_NAME"
  138.  
  139.     # on 2.4 systems, modutils maintains MAP_CURRENT
  140.     if [ -r $MAP_CURRENT ]; then
  141.         load_drivers pci $MAP_CURRENT "$LABEL"
  142.     fi
  143.  
  144.     if [ "$DRIVERS" = "" ]; then
  145.     debug_mesg "... no modules for $LABEL"
  146.     exit 2
  147.     fi
  148.     ;;
  149.  
  150. *)
  151.     debug_mesg PCI $ACTION event not supported
  152.     exit 1
  153.     ;;
  154.  
  155. esac
  156.